package com.whfc.emp.service;

import com.whfc.common.exception.BizException;
import com.whfc.common.result.ListData;
import com.whfc.common.result.PageData;
import com.whfc.common.result.PageVO;
import com.whfc.emp.dto.*;
import com.whfc.emp.dto.openapi.OpenApiEmpDTO;
import com.whfc.emp.entity.AppEmp;
import com.whfc.emp.enums.AppWorkRole;
import com.whfc.emp.param.*;
import com.whfc.entity.dto.OssPathDTO;

import java.util.Date;
import java.util.List;

/**
 * @Description 人员管理
 * @Author hw
 * @Date 2020/12/28 9:51
 * @Version 1.0
 */
public interface AppEmpService {


    /**
     * 人员列表(分页)
     *
     * @param request
     * @return
     * @throws BizException
     */
    PageData<AppEmpDTO> list(AppEmpListParam request) throws BizException;

    /**
     * 人员统计
     *
     * @param request
     * @return
     * @throws BizException
     */
    AppEmpNumDTO empNum(AppEmpListParam request) throws BizException;

    /**
     * 根据组织机构ID获取人员列表
     *
     * @param deptIdList 组织机构ID
     * @param pageNum    页码
     * @param pageSize   每页数量
     * @return 人员列表
     * @throws BizException 业务异常
     */
    PageData<AppEmpDTO> listByDeptIdList(List<Integer> deptIdList, Integer pageNum, Integer pageSize) throws BizException;

    /**
     * 人员导出
     *
     * @return
     */
    OssPathDTO export(AppEmpListExportParam request) throws BizException;

    /**
     * 人员列表（不分页）
     *
     * @param deptId
     * @param empName
     * @return
     */
    List<AppEmpDTO> list(Integer deptId, String empName) throws BizException;

    /**
     * 查看人员详情
     *
     * @param empId
     * @return
     */
    AppEmpDTO detail(Integer empId) throws BizException;

    /**
     * 获取人员信息
     *
     * @param empId 人员ID
     * @return AppEmpDTO
     */
    AppEmpDTO getEmpInfo(Integer empId) throws BizException;

    /**
     * 保存人员二维码
     *
     * @param empId
     */
    OssPathDTO getEmpQr(Integer empId) throws BizException;

    /**
     * 人员管理-添加人员
     *
     * @param request
     */
    void add(AppEmpAddParam request) throws BizException;

    /**
     * 人员管理-编辑人员
     *
     * @param request
     */
    void edit(AppEmpEditParam request) throws BizException;

    /**
     * 人员管理-删除人员
     *
     * @param empId
     */
    void del(Integer empId) throws BizException;

    /**
     * 人员管理-人员进场
     *
     * @param request
     */
    void enter(AppEmpEnterParam request) throws BizException;

    /**
     * 人员管理-人员退场
     *
     * @param request
     */
    void outer(AppEmpOuterParam request) throws BizException;

    /**
     * 人员离职
     * @param empIds
     * @param date
     * @throws BizException
     */
    void outer(List<Integer> empIds,Date date) throws BizException;

    /**
     * 人员管理-人员绑定安全帽
     *
     * @param userName
     * @param userId
     * @param request
     */
    void bind(String userName, Integer userId, AppEmpDeviceBindParam request) throws BizException;

    /**
     * 人员管理-人员解除绑定安全帽
     *
     * @param userName
     * @param userId
     * @param request
     */
    void unbind(String userName, Integer userId, AppEmpDeviceUnbindParam request) throws BizException;

    /**
     * 查询人员轨迹
     *
     * @param empId
     * @param date
     * @return
     * @throws BizException
     */
    List<AppEmpGpsDTO> getGpsList(Integer empId, Date date) throws BizException;

    /**
     * 人员证书列表
     *
     * @param empId
     * @return
     */
    List<AppEmpCertDTO> certList(Integer empId) throws BizException;

    /**
     * 添加证书
     *
     * @param request
     */
    void addCert(AppEmpCertAddParam request) throws BizException;

    /**
     * 编辑证书
     *
     * @param request
     */
    void editCert(AppEmpCertEditParam request) throws BizException;

    /**
     * 删除人员证书
     *
     * @param certId
     */
    void delCert(Integer certId) throws BizException;

    /**
     * 小程序中的人员列表(不分页)
     *
     * @param deptId
     * @param keyword
     * @return
     */
    List<WxEmpGroupDTO> getEmpList(Integer deptId, String keyword) throws BizException;

    List<AppEmpDTO> getLeaderList(Integer deptId, String keyword) throws BizException;

    /**
     * 查询地图页人员列表
     *
     * @param deptId
     * @return
     */
    WxMapEmpDTO getMapList(Integer deptId) throws BizException;

    /**
     * 查询地图页人员列表
     *
     * @param deptId
     * @return
     */
    WxMapEmpDTO getMapListNew(Integer deptId, List<Integer> groupIds, List<Integer> corpIds,String name) throws BizException;

    /**
     * 新增人员并绑定硬件
     *
     * @param userId
     * @param userName
     * @param request
     */
    void bindAndAddEmp(Integer userId, String userName, DeviceBindEmp request) throws BizException;

    /**
     * 人员和硬件解绑
     *
     * @param userId
     * @param userName
     * @param empId
     */
    void unbindEmpDevice(Integer userId, String userName, Integer empId) throws BizException;

    /**
     * 硬件绑定前检验
     *
     * @param sn
     * @return
     */
    DeviceBindCheckDTO bindCheck(String sn);

    /**
     * 查询人员工时数据
     *
     * @param empId
     * @param date
     * @return
     */
    WxEmpWorkHourDTO getEmpWorkHour(Integer empId, Date date);

    /**
     * 查询人员当前位置
     *
     * @param empId
     * @return
     */
    AppEmpGpsDTO getLatestGps(Integer empId);

    /**
     * 获取微信人员数据中心
     *
     * @param deptId 组织机构ID
     * @return 人员数据中心
     */
    WxEmpDataCenterDTO getEmpDataCenter(Integer deptId);

    /**
     * 根据工种角色统计人数
     *
     * @param deptId      组织机构id
     * @param appWorkRole 工种角色
     * @return 人数
     * @throws BizException 业务异常
     */
    Integer countByWorkRole(Integer deptId, AppWorkRole appWorkRole) throws BizException;

    /**
     * 查看在场人数
     *
     * @param deptId 组织机构ID
     * @return 在场人数
     * @throws BizException 业务异常
     */
    Integer countLocaleEmpNum(Integer deptId) throws BizException;

    /**
     * 根据合作单位ID查找人员数量
     *
     * @param corpId 合作单位ID
     * @return 人员数量
     */
    Integer countEmpByCorpId(Integer corpId) throws BizException;

    /**
     * 人员审批列表
     *
     * @param deptId
     * @param checkResult
     * @param startTime
     * @param endTime
     * @param pageSize
     * @param pageNum
     * @return
     * @throws BizException
     */
    PageData<AppEmpApplyDTO> getApplyList(Integer deptId, Integer checkResult, Date startTime, Date endTime, Integer pageSize, Integer pageNum) throws BizException;

    /**
     * 统计人员审批
     *
     * @param deptId
     * @param startTime
     * @param endTime
     * @return
     * @throws BizException
     */
    AppEmpApplyNumDTO getApplyNum(Integer deptId, Date startTime, Date endTime) throws BizException;

    /**
     * 人员审批详情
     *
     * @param applyEmpId
     * @return
     * @throws BizException
     */
    AppEmpApplyDTO getApplyDetail(Integer applyEmpId) throws BizException;

    /**
     * 删除人员审批
     *
     * @param applyEmpId
     * @throws BizException
     */
    void applyDel(Integer applyEmpId) throws BizException;

    /**
     * 人员审核
     *
     * @param param
     * @throws BizException
     */
    void checkApply(AppEnpApplyCheckParam param) throws BizException;

    /**
     * 人员申请
     *
     * @param param
     * @throws BizException
     */
    void empApplyAdd(AppEmpAddParam param) throws BizException;

    /**
     * 身份证认证失败
     *
     * @param imgUrl
     * @param sessionId
     * @return
     * @throws BizException
     */
    AppEmpIdentifyDTO idCardIdentify(String imgUrl, String sessionId) throws BizException;

    /**
     * 导入人员
     *
     * @param deptId
     * @param importParamList
     * @throws BizException
     */
    void importEmp(Integer deptId, List<AppEmpImportParam> importParamList) throws BizException;

    /**************************************  开放平台  **************************************************/

    /**
     * 查询人员列表 开放平台使用  分页
     *
     * @param deptId   组织机构ID
     * @param pageNum  页码
     * @param pageSize 每页数量
     * @return 人员列表
     * @throws BizException 业务异常
     */
    PageData<OpenApiEmpDTO> listOpenApiEmp(Integer deptId, Integer pageNum, Integer pageSize) throws BizException;

    /**
     * 查询人员列表 开放平台使用  不分页
     *
     * @param deptId 组织机构ID
     * @return 人员列表
     * @throws BizException 业务异常
     */
    List<OpenApiEmpDTO> listOpenApiEmp(Integer deptId) throws BizException;

    /**
     * 获取开放平台
     *
     * @param empId
     * @return
     * @throws BizException
     */
    OpenApiEmpDTO getOpenApiEmpDetail(Integer empId) throws BizException;

    /**
     * 人员管理-添加人员
     *
     * @param request
     * @return
     */
    Integer addEmp(AppEmpAddParam request) throws BizException;


    /**
     * 查询人员轨迹(分页)
     *
     * @param empId
     * @param date
     * @return
     * @throws BizException
     */
    PageVO<AppEmpGpsDTO> getGpsListPage(Integer empId, Date date, Integer page, Integer size) throws BizException;

    void delList(List<Integer> empIdList) throws BizException;

    AppEmp selectByDeptIdAndIdCardNo(int deptId,String idCard);

    void updateById(AppEmp appEmp)throws BizException;

    void attendanceSave(EmpAttendSyncDataParam empAttendSyncDataParam) throws BizException;

    List<String> checkGps(Double lng, Double lat, Integer deptId) throws BizException;

    List<AppEmpDTO> getListByPhone(String phone);

    boolean checkVideoHelmet(String sn);

    void syncWorker(AppEmpEditParam request)throws BizException;

    /**
     * 获取人员信息
     *
     * @param ids 人员ID
     * @return AppEmpDTO
     */
    List<AppEmp> getEmpInfoList(List<String> ids) throws BizException;

    List<AppAttachDTO>  selectByEmpIdUrl(Integer empId);


}
